{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# path to where the data lies\n",
    "dpath = './code/data/'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# drop ids and get labels\n",
    "y_train = train['interest_level']\n",
    "\n",
    "train = train.drop([\"interest_level\"], axis=1)\n",
    "X_train = train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/lyc/anaconda2/lib/python2.7/site-packages/sklearn/model_selection/_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 训练样本6w+，交叉验证太慢，用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.33,random_state = 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 默认参数，此时学习率为0.1，比较大，观察弱分类数目的大致范围 （采用默认参数配置，看看模型是过拟合还是欠拟合）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#直接调用xgboost内嵌的交叉验证（cv），可对连续的n_estimators参数进行快速交叉验证\n",
    "#而GridSearchCV只能对有限个参数进行交叉验证\n",
    "def modelfit(alg, X_train, y_train, cv_folds=5, early_stopping_rounds=10):\n",
    "    xgb_param = alg.get_xgb_params()\n",
    "    xgb_param['num_class'] = 3\n",
    "    \n",
    "    #直接调用xgboost，而非sklarn的wrapper类\n",
    "    xgtrain = xgb.DMatrix(X_train, label = y_train)\n",
    "        \n",
    "    cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds =cv_folds,\n",
    "             metrics='mlogloss', early_stopping_rounds=early_stopping_rounds)\n",
    "  \n",
    "    cvresult.to_csv('1_nestimators.csv', index_label = 'n_estimators')\n",
    "    \n",
    "    #最佳参数n_estimators\n",
    "    n_estimators = cvresult.shape[0]\n",
    "    \n",
    "    # 采用交叉验证得到的最佳参数n_estimators，训练模型\n",
    "    alg.set_params(n_estimators = n_estimators)\n",
    "    alg.fit(X_train, y_train, eval_metric='mlogloss')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#params = {\"objective\": \"multi:softprob\", \"eval_metric\":\"mlogloss\", \"num_class\": 9}\n",
    "xgb1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=1000,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=6,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample = 0.5,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "modelfit(xgb1, X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'base_score': 0.5,\n",
       " 'booster': 'gbtree',\n",
       " 'colsample_bylevel': 0.7,\n",
       " 'colsample_bytree': 0.8,\n",
       " 'gamma': 0,\n",
       " 'learning_rate': 0.1,\n",
       " 'max_delta_step': 0,\n",
       " 'max_depth': 6,\n",
       " 'min_child_weight': 1,\n",
       " 'missing': None,\n",
       " 'n_estimators': 213,\n",
       " 'nthread': 1,\n",
       " 'objective': 'multi:softprob',\n",
       " 'reg_alpha': 0,\n",
       " 'reg_lambda': 1,\n",
       " 'scale_pos_weight': 1,\n",
       " 'seed': 3,\n",
       " 'silent': 1,\n",
       " 'subsample': 0.5}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb1.get_xgb_params()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7e98904810>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "        \n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "        \n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators4_1.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第一轮参数调整得到的n_estimators最优值（213），其余参数继续默认值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [4, 6, 8]}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = range(4,10,2)\n",
    "#min_child_weight = range(1,6,2)\n",
    "#param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_1 = dict(max_depth=max_depth)\n",
    "param_test2_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/lyc/anaconda2/lib/python2.7/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.59447, std: 0.00295, params: {'max_depth': 4},\n",
       "  mean: -0.58867, std: 0.00244, params: {'max_depth': 6},\n",
       "  mean: -0.59562, std: 0.00383, params: {'max_depth': 8}],\n",
       " {'max_depth': 6},\n",
       " -0.5886740887570239)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "xgb2_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=213,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=6,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.5,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2_1 = GridSearchCV(xgb2_1, param_grid = param_test2_1, scoring='neg_log_loss',n_jobs=-1, cv=3)\n",
    "gsearch2_1.fit(X_train , y_train)\n",
    "\n",
    "gsearch2_1.grid_scores_, gsearch2_1.best_params_,     gsearch2_1.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第一轮参数调整得到的n_estimators最优值（213），max_depth=6\n",
    "\n",
    "其余参数继续默认值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'min_child_weight': [1, 3, 5]}"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "#max_depth = range(4,10,2)\n",
    "min_child_weight = range(1,6,2)\n",
    "#param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test3 = dict(min_child_weight=min_child_weight)\n",
    "param_test3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/lyc/anaconda2/lib/python2.7/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.58867, std: 0.00244, params: {'min_child_weight': 1},\n",
       "  mean: -0.58900, std: 0.00251, params: {'min_child_weight': 3},\n",
       "  mean: -0.58929, std: 0.00245, params: {'min_child_weight': 5}],\n",
       " {'min_child_weight': 1},\n",
       " -0.5886740887570239)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb3 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=213,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=6,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.5,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch3= GridSearchCV(xgb3, param_grid = param_test3, scoring='neg_log_loss',n_jobs=-1, cv=3)\n",
    "gsearch3.fit(X_train , y_train)\n",
    "\n",
    "gsearch3.grid_scores_, gsearch3.best_params_,     gsearch3.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 此前已经调好的参数： n_estimators：213 max_depth：6 min_child_weight：1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'reg_alpha': [0.1, 1, 2]}"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg_alpha = [ 0.1, 1, 2]    #default = 0, 测试0.1,1，1.5，2\n",
    "#reg_lambda = [0.5, 1, 2]      #default = 1，测试0.1， 0.5， 1，2\n",
    "\n",
    "param_test4 = dict(reg_alpha=reg_alpha)\n",
    "param_test4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/lyc/anaconda2/lib/python2.7/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.58902, std: 0.00271, params: {'reg_alpha': 0.1},\n",
       "  mean: -0.58861, std: 0.00211, params: {'reg_alpha': 1},\n",
       "  mean: -0.58864, std: 0.00279, params: {'reg_alpha': 2}],\n",
       " {'reg_alpha': 1},\n",
       " -0.5886141705198045)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb4 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=213,  #第二轮参数调整得到的n_estimators最优值\n",
    "        max_depth=6,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.5,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch4 = GridSearchCV(xgb4, param_grid = param_test4, scoring='neg_log_loss',n_jobs=-1, cv=3)\n",
    "gsearch4.fit(X_train , y_train)\n",
    "\n",
    "gsearch4.grid_scores_, gsearch4.best_params_,     gsearch4.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "此前已经调好的参数： n_estimators：213 max_depth：6 min_child_weight：1 reg_alpha：1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'reg_lambda': [0.1, 1, 2]}"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#reg_alpha = [ 0.1, 1, 2]    #default = 0, 测试0.1,1，1.5，2\n",
    "reg_lambda = [0.1, 1, 2]      #default = 1，测试0.1， 0.5， 1，2\n",
    "\n",
    "param_test5 = dict(reg_lambda=reg_lambda)\n",
    "param_test5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/lyc/anaconda2/lib/python2.7/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.58919, std: 0.00171, params: {'reg_lambda': 0.1},\n",
       "  mean: -0.58861, std: 0.00211, params: {'reg_lambda': 1},\n",
       "  mean: -0.58815, std: 0.00186, params: {'reg_lambda': 2}],\n",
       " {'reg_lambda': 2},\n",
       " -0.5881514884979496)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb5 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=213,  #第二轮参数调整得到的n_estimators最优值\n",
    "        max_depth=6,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.5,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        reg_alpha = 1,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch5 = GridSearchCV(xgb5, param_grid = param_test5, scoring='neg_log_loss',n_jobs=-1, cv=3)\n",
    "gsearch5.fit(X_train , y_train)\n",
    "\n",
    "gsearch5.grid_scores_, gsearch5.best_params_,     gsearch5.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "改小此时学习率为0.02，调整弱分类数目\n",
    "\n",
    "此前已经调好的参数： n_estimators：213 max_depth：6 min_child_weight：1 reg_alpha：1 reg_lambda：2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#直接调用xgboost内嵌的交叉验证（cv），可对连续的n_estimators参数进行快速交叉验证\n",
    "#而GridSearchCV只能对有限个参数进行交叉验证\n",
    "def modelfit(alg, X_train, y_train, cv_folds=3, early_stopping_rounds=10):\n",
    "    xgb_param = alg.get_xgb_params()\n",
    "    xgb_param['num_class'] = 3\n",
    "    \n",
    "    #直接调用xgboost，而非sklarn的wrapper类\n",
    "    xgtrain = xgb.DMatrix(X_train, label = y_train)\n",
    "        \n",
    "    cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds =cv_folds,\n",
    "             metrics='mlogloss', early_stopping_rounds=early_stopping_rounds)\n",
    "  \n",
    "    cvresult.to_csv('6_nestimators.csv', index_label = 'n_estimators')\n",
    "    \n",
    "    #最佳参数n_estimators\n",
    "    n_estimators = cvresult.shape[0]\n",
    "    \n",
    "    # 采用交叉验证得到的最佳参数n_estimators，训练模型\n",
    "    alg.set_params(n_estimators = n_estimators)\n",
    "    alg.fit(X_train, y_train, eval_metric='mlogloss')\n",
    "        \n",
    "    #Predict training set:\n",
    "    train_predprob = alg.predict_proba(X_train)\n",
    "    logloss = log_loss(y_train, train_predprob)\n",
    "\n",
    "   #Print model report:\n",
    "    print 'logloss of train is:', logloss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of train is: 0.4845658456003438\n"
     ]
    }
   ],
   "source": [
    "#params = {\"objective\": \"multi:softprob\", \"eval_metric\":\"mlogloss\", \"num_class\": 9}\n",
    "xgb6 = XGBClassifier(\n",
    "        learning_rate =0.02,\n",
    "        n_estimators=2000,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=6,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample = 0.5,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        reg_alpha = 1,\n",
    "        reg_lambda = 2,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "modelfit(xgb6, X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'base_score': 0.5,\n",
       " 'booster': 'gbtree',\n",
       " 'colsample_bylevel': 0.7,\n",
       " 'colsample_bytree': 0.8,\n",
       " 'gamma': 0,\n",
       " 'learning_rate': 0.02,\n",
       " 'max_delta_step': 0,\n",
       " 'max_depth': 6,\n",
       " 'min_child_weight': 1,\n",
       " 'missing': None,\n",
       " 'n_estimators': 1028,\n",
       " 'nthread': 1,\n",
       " 'objective': 'multi:softprob',\n",
       " 'reg_alpha': 1,\n",
       " 'reg_lambda': 2,\n",
       " 'scale_pos_weight': 1,\n",
       " 'seed': 3,\n",
       " 'silent': 1,\n",
       " 'subsample': 0.5}"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb6.get_xgb_params()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f06a416c650>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('6_nestimators.csv')\n",
    "        \n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "        \n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators6.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 保存模型，供测试使用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#保存模型\n",
    "import cPickle\n",
    "cPickle.dump(xgb6, open(\"xgb_model.pkl\", 'wb'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of train is: 0.4845658456003438\n"
     ]
    }
   ],
   "source": [
    "#保存数据\n",
    "import cPickle\n",
    "\n",
    "xgb = cPickle.load(open(\"xgb_model.pkl\", 'rb'))\n",
    "\n",
    "train_predprob = xgb.predict_proba(X_train)\n",
    "logloss = log_loss(y_train, train_predprob)\n",
    "\n",
    "#Print model report:\n",
    "print 'logloss of train is:', logloss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 利用训练好的模型，在测试集上进行测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>virtual</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2950</td>\n",
       "      <td>1475.000000</td>\n",
       "      <td>1475.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>11</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>950.000000</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3758</td>\n",
       "      <td>1879.000000</td>\n",
       "      <td>1879.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>3300</td>\n",
       "      <td>1650.000000</td>\n",
       "      <td>1100.000000</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>11</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2.0</td>\n",
       "      <td>2</td>\n",
       "      <td>4900</td>\n",
       "      <td>1633.333333</td>\n",
       "      <td>1633.333333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 227 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.0         1   2950      1475.000000     1475.000000        0.0   \n",
       "1        1.0         2   2850      1425.000000      950.000000       -1.0   \n",
       "2        1.0         1   3758      1879.000000     1879.000000        0.0   \n",
       "3        1.0         2   3300      1650.000000     1100.000000       -1.0   \n",
       "4        2.0         2   4900      1633.333333     1633.333333        0.0   \n",
       "\n",
       "   room_num  Year  Month  Day  ...   virtual  walk  walls  war  washer  water  \\\n",
       "0       2.0  2016      6   11  ...         0     0      0    0       0      0   \n",
       "1       3.0  2016      6   24  ...         0     0      0    1       0      0   \n",
       "2       2.0  2016      6    3  ...         0     0      0    0       0      0   \n",
       "3       3.0  2016      6   11  ...         0     0      0    0       0      0   \n",
       "4       4.0  2016      4   12  ...         0     0      0    1       0      0   \n",
       "\n",
       "   wheelchair  wifi  windows  work  \n",
       "0           0     0        0     0  \n",
       "1           0     0        0     0  \n",
       "2           0     0        0     0  \n",
       "3           1     0        0     0  \n",
       "4           0     0        0     0  \n",
       "\n",
       "[5 rows x 227 columns]"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# path to where the data lies\n",
    "dpath = './code/data/'\n",
    "test = pd.read_csv(dpath +\"RentListingInquries_FE_test.csv\")\n",
    "test.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_test = test"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## load 训练好的模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "#保存数据\n",
    "import cPickle\n",
    "\n",
    "xgb = cPickle.load(open(\"xgb_model.pkl\", 'rb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 在测试上测试，并生成测试结果提交文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'test_id' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-38-e112dcf6ec71>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mout_df1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m\"high\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"medium\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"low\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mout_df\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtest_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mout_df1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      7\u001b[0m \u001b[0mout_df\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"xgb_Rent.csv\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mNameError\u001b[0m: name 'test_id' is not defined"
     ]
    }
   ],
   "source": [
    "y_test_pred = xgb.predict_proba(X_test)\n",
    "\n",
    "out_df1 = pd.DataFrame(y_test_pred)\n",
    "out_df1.columns = [\"high\", \"medium\", \"low\"]\n",
    "\n",
    "out_df = pd.concat([test_id,out_df1], axis = 1)\n",
    "out_df.to_csv(\"xgb_Rent.csv\", index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
